package com.zjl.redis.第14章_大数据统计;

import org.junit.Test;

/**
 * ●Redis HyperLogLog是用来做基数统计的算法，HyperLogLog 的优点是,
 * 在输入元素的数量或者体积非常非常大时，计算基数所需的空间总是固定的、并且是很小的。
 * ●在Redis里面，每个HyperLogLog键只需要花费12 KB内存，就可以计算接近2^64个不同元素的基数。
 * 这和计算基数时，元素越多耗费内存就越多的集合形成鲜明对比。
 * ●但是，因为HyperLogLog只会根据输入元素来计算基数，而不会储存输入元素本身，
 * 所以HyperLogLog不能像集合那样，返回输入的各个元素。
 *
 *
 * Redis使用了2^14=16384个桶，按照上面的标准差，误差为0.81%， 精度相当高。
 * Redis使用一个long型哈希值的前14个比特用来确定桶编号，剩下的50个比特用来做基数估计。
 * 而2^6=64,所以只需要用6个比特表示下标值，在一般情况下，
 * 一个HLL数据结构占用内存的大小为 16384*6/8= 12kB, Redis将这种情况称为密集(dense) 存储。
 *
 */
public class A2_HyperLogLog的源码分析 {
    @Test
    public void 误差计算(){
        System.out.println(1.04/Math.sqrt(16384));//0.008125
    }
}

